import { DirectiveBinding } from 'vue';
import Cookies from 'js-cookie';
import debounce from 'lodash/debounce';

// 定义跟踪信息接口
interface TrackInfo {
  appname: string;
  usrid?: string;
  usrname?: string;
  time?: number;
  label?: {
    firstLevel: string;
  };
}

interface ElType extends HTMLElement {
  _trackingData: any;
  _trackingHandler: ((event: Event) => void) | undefined;
}

// 声明全局变量
declare global {
  interface Window {
    META_ENV_MAP?: {
      VUE_APP_TRACK_URL: string;
    };
  }
}

export default {
  mounted(el: ElType, binding: DirectiveBinding) {
    // 存储元素数据，用于后续更新
    el._trackingData = binding.value;

    // 定义处理函数
    const handleClick = function () {
      // 获取当前最新的数据
      const value = el._trackingData;

      // 初始化变量
      let appname = '';
      let firstLevel = undefined;

      // 根据不同类型处理数据
      if (value.type === 'app') {
        // 应用类型，只传递appname
        appname = value.name;
      } else if (value.type === 'menu') {
        // firstLevel字段存储的是菜单项的名称
        firstLevel = value.firstLevel;
        appname = value.name; // 这里的name实际上是父应用的名称
      } else if (value.type === 'search') {
        // 搜索类型
        if (value.appName) {
          appname = value.appName;
          firstLevel = value.label;
        } else {
          appname = value.label;
        }
      }

      // 获取用户信息
      const usrid = Cookies.get('LOGINNAME');
      const usrname = Cookies.get('userInfo') && JSON.parse(Cookies.get('userInfo') || '{}')?.name;

      // 构建跟踪信息对象
      const info: TrackInfo = {
        appname,
        usrid,
        usrname,
        time: new Date().getTime()
      };

      // 如果有firstLevel，添加label对象
      if (firstLevel) {
        info.label = {
          firstLevel
        };
      }

      // 创建图片请求
      const img = new Image();
      img.onload = function () {
        console.log('【请求结果】跟踪数据发送成功');
      };
      img.onerror = function () {
        console.error('【请求结果】跟踪数据发送失败');
      };

      // 获取环境变量
      const trackUrl = window.META_ENV_MAP?.VUE_APP_TRACK_URL || '/api/track';
      img.src = trackUrl + '?data=' + encodeURIComponent(JSON.stringify(info));
    };

    // 使用防抖处理点击事件
    el._trackingHandler = debounce(handleClick, 50);

    // 绑定点击事件
    el.addEventListener('click', el._trackingHandler);
  },

  // 当绑定值更新时
  updated(el: ElType, binding: DirectiveBinding) {
    // 更新元素存储的数据
    el._trackingData = binding.value;
  },

  beforeUnmount(el: ElType) {
    // 清理事件监听器
    if (el._trackingHandler) {
      el.removeEventListener('click', el._trackingHandler);
      el._trackingHandler = undefined;
      el._trackingData = undefined;
    }
  }
};
